#include "OrthographicCamera.h"
#include "Debug/Instrumentor.h"

namespace Hazel{
    void OrthographicCamera::SetProjection(float left, float right, float bottom, float top) {
        HZ_PROFILE_FUNCTION();
        m_ProjectionMatrix = glm::ortho(left, right, bottom, top, -1.0f, 1.0f);
        m_ViewProjectionMatrix = m_ProjectionMatrix * m_ViewMatrix;
    }
    OrthographicCamera::OrthographicCamera(float left, float right, float bottom, float top)
            : m_ProjectionMatrix(glm::ortho(left, right, bottom, top, -1.0f, 1.0f)), m_ViewMatrix(1.0f)
    {
//        HZ_GLM4(m_ProjectionMatrix);
        /*
        [ 2/(right-left),   0,               0,            -(right+left)/(right-left) ]
        [ 0,               2/(top-bottom),   0,            -(top+bottom)/(top-bottom) ]
        [ 0,               0,               -2/(zFar-zNear), -(zFar+zNear)/(zFar-zNear) ]
        [ 0,               0,               0,              1 ]
         *
         * -1.6f, 1.6f, -0.9f, 0.9f 转换为正交矩阵就是下面这个样子
        [0.625 0 0 0 ]
        [0 1.11111 0 0 ]
        [0 0 -1 0 ]
        [-0 -0 -0 1 ]
         *
         * */
//        HZ_GLM4(m_ProjectionMatrix);
//        HZ_GLM4(m_ViewMatrix);
        HZ_PROFILE_FUNCTION();
        m_ViewProjectionMatrix = m_ProjectionMatrix * m_ViewMatrix;
//        HZ_GLM4(m_ViewProjectionMatrix);
    }
    /*
     * ViewMatrix计算方法 相机不动，整个世界动。
     * 把摄像机放到世界中心原点，把所有物体进行平移
     * 平移后，还需要对摄像机进行旋转 面向负Z轴方向(这一步通过旋转世界空间的Y轴到观察空间的T轴（‌摄像机的上向量）‌)
     * Z轴到-G轴（‌摄像机的视线方向总是朝向负半轴,世界坐标系z轴到相机里面前的方向）‌
     * */
    void OrthographicCamera::RecalculateViewMatrix() {
        HZ_PROFILE_FUNCTION();
        // glm::translate 创建一个平移矩阵 第一个参数是目标矩阵，第二个参数是平移方向的向量
        // glm::radians(m_Rotation) 将角度值m_Rotation从度转换为弧度，因为GLM库中的三角函数使用弧度  弧度= 角度
        // glm::vec3(0, 0, 1)定义了一个向量，表示绕Z轴旋转。
        // glm::rotate(...)：这行代码将平移矩阵与旋转矩阵相乘，得到一个变换矩阵transform，它包含了平移和旋转的组合效果。
        glm::mat4 transform = glm::translate(glm::mat4(1.0f), m_Position) *
                              glm::rotate(glm::mat4(1.0f), glm::radians(m_Rotation), glm::vec3(0, 0, 1));
        // 求transform矩阵的逆矩阵 m_ViewMatrix = 描述平移和旋转
        m_ViewMatrix = glm::inverse(transform);
        m_ViewProjectionMatrix = m_ProjectionMatrix * m_ViewMatrix;

//        HZ_GLM4(m_ViewProjectionMatrix);
    }
}